package com.winz.cultureapp.http.util;

import com.winz.cultureapp.entity.EventBusBean;
import com.winz.cultureapp.http.OnResponeListener;
import com.winz.cultureapp.http.restful.Api;
import com.winz.cultureapp.http.restful.RetrofitProvider;
import com.winz.cultureapp.utils.SharePrefsUtil;

import org.greenrobot.eventbus.EventBus;

import java.lang.reflect.Method;
import java.util.Map;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;

/**
 * 网络请求工具类
 */
public class HttpUitls {

    /**
     * GET请求
     * @param url 在API中定义的方法名
     * @param listener 成功数据返回
     */
    public static <T> void onGet(String url,OnResponeListener<T> listener) {
        // 1.获得Api的class对象
        Class c = Api.class;
        Method method = null;
        try {
            // 2.找到方法名为url的方法
            method = c.getMethod(url);
            // 3.调用些方法
            Observable<T> observable = (Observable<T>) method.invoke(RetrofitProvider.Factory.getApiService());
            observable .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<T>() {
                        @Override
                        public void onSubscribe(Disposable d) { }
                        @Override
                        public void onNext(T t) {
                            // 4.成功返回
                            if (listener != null){
                                listener.onSuccess(t);
                            }
                        }
                        @Override
                        public void onError(Throwable e) {
                            if (listener != null){
                                listener.onFailed(e.toString());
                            }
                        }
                        @Override
                        public void onComplete() { }
                    });
        } catch (Exception e) {
            if (listener != null){
                listener.onFailed(e.toString());
            }
            e.printStackTrace();
        }
    }

    /**
     * GET请求
     * @param url 在API中定义的方法名
     * @param params 所有参数
     * @param listener 成功数据返回
     */
    public static <T,B> void onGet(String url, B params, OnResponeListener<T> listener) {
        // 1.获得Api的class对象
        Class c = Api.class;
        Method method = null;
        try {
            // 2.找到方法名为url的方法
            method = c.getMethod(url,params.getClass());
            // 3.调用些方法
            Observable<T> observable = (Observable<T>) method.invoke(RetrofitProvider.Factory.getApiService(),params);
            observable .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<T>() {
                        @Override
                        public void onSubscribe(Disposable d) { }
                        @Override
                        public void onNext(T t) {
                            // 4.成功返回
                            if (listener != null){
                                listener.onSuccess(t);
                            }
                        }
                        @Override
                        public void onError(Throwable e) {
                            if (listener != null){
                                listener.onFailed(e.toString());
                            }
                        }
                        @Override
                        public void onComplete() { }
                    });
        } catch (Exception e) {
            if (listener != null){
                listener.onFailed(e.toString());
            }
            e.printStackTrace();
        }
    }

    /**
     * GET请求
     * @param url 在API中定义的方法名
     * @param params 所有参数
     * @param listener 成功数据返回
     */
    public static <T,B> void onGetByToken(String url, String token,B params, OnResponeListener<T> listener) {
        // 1.获得Api的class对象
        Class c = Api.class;
        Method method = null;
        try {
            // 2.找到方法名为url的方法
            method = c.getMethod(url,String.class,params.getClass());
            String name = method.getName();
            // 3.调用些方法
            Observable<T> observable = (Observable<T>) method.invoke(RetrofitProvider.Factory.getApiService(),token,params);
            observable .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<T>() {
                        @Override
                        public void onSubscribe(Disposable d) { }
                        @Override
                        public void onNext(T t) {
                            // 4.成功返回
                            if (listener != null){
                                listener.onSuccess(t);
                            }
                        }
                        @Override
                        public void onError(Throwable e) {
                            if (listener != null){
                                listener.onFailed(e.toString());
                            }
                        }
                        @Override
                        public void onComplete() { }
                    });
        } catch (Exception e) {
            if (listener != null){
                listener.onFailed(e.toString());
            }
            e.printStackTrace();
        }
    }

//    /**
//     * GET请求
//     * @param url 在API中定义的方法名
//     * @param params 所有参数
//     * @param listener 成功数据返回
//     */
//    public static <T> void onGet(String url, String params, OnResponeListener<T> listener) {
//        // 1.获得Api的class对象
//        Class c = Api.class;
//        Method method = null;
//        try {
//            // 2.找到方法名为url的方法
//            method = c.getMethod(url,String.class);
//            // 3.调用些方法
//            Observable<T> observable = (Observable<T>) method.invoke(RetrofitProvider.Factory.getApiService(),params);
//            observable .subscribeOn(Schedulers.io())
//                    .observeOn(AndroidSchedulers.mainThread())
//                    .subscribe(new Observer<T>() {
//                        @Override
//                        public void onSubscribe(Disposable d) { }
//                        @Override
//                        public void onNext(T t) {
//                            // 4.成功返回
//                            if (listener != null){
//                                listener.onSuccess(t);
//                            }
//                        }
//                        @Override
//                        public void onError(Throwable e) {
//                            if (listener != null){
//                                listener.onFailed(e.toString());
//                            }
//                        }
//                        @Override
//                        public void onComplete() { }
//                    });
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }

    /**
     * Post请求
     * @param url 在API中定义的方法名
     * @param body 所有参数
     * @param listener 成功数据返回
     */
    public static <T,B> void onPost(String url, B body, OnResponeListener<T> listener) {
        // 1.获得Api的class对象
        Class c = Api.class;
        Method method = null;
        try {
            // 2.找到方法名为url的方法
            method = c.getMethod(url, body.getClass());
            // 3.调用些方法
            Observable<T> observable = (Observable<T>) method.invoke(RetrofitProvider.Factory.getApiService(),body);
            observable .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<T>() {
                        @Override
                        public void onSubscribe(Disposable d) { }
                        @Override
                        public void onNext(T t) {
                            // 4.成功返回
                            if (listener != null){
                                listener.onSuccess(t);
                            }
                        }
                        @Override
                        public void onError(Throwable e) {
                            if (listener != null){
                                listener.onFailed(e.toString());
                            }
                        }
                        @Override
                        public void onComplete() { }
                    });
        } catch (Exception e) {
            if (listener != null){
                listener.onFailed(e.toString());
            }
            e.printStackTrace();
        }
    }

    /**
     * Post请求
     * @param url 在API中定义的方法名
     * @param body 所有参数
     * @param token 用户信息
     * @param listener 成功数据返回
     */
    public static <T,B> void onPostByToken(String url, String token, B body, OnResponeListener<T> listener) {
        // 1.获得Api的class对象
        Class c = Api.class;
        Method method = null;
        try {
            // 2.找到方法名为url的方法
            method = c.getMethod(url, String.class,body.getClass());
            // 3.调用些方法
            Observable<T> observable = (Observable<T>) method.invoke(RetrofitProvider.Factory.getApiService(),token,body);
            observable .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<T>() {
                        @Override
                        public void onSubscribe(Disposable d) { }
                        @Override
                        public void onNext(T t) {
                            // 4.成功返回
                            if (listener != null){
                                listener.onSuccess(t);
                            }
                        }
                        @Override
                        public void onError(Throwable e) {
                            if (listener != null){
                                listener.onFailed(e.toString());
                            }
                        }
                        @Override
                        public void onComplete() { }
                    });
        } catch (Exception e) {
            if (listener != null){
                listener.onFailed(e.toString());
            }
            e.printStackTrace();
        }
    }

    /**
     * 判断是否过期
     * @param code
     * @return
     */
    public static boolean isExpire(int code){
        boolean expire = code == 1001;
        if (expire){
            // 清除本地用户数据
            SharePrefsUtil.getInstance().delectedUserInfo();

            EventBus.getDefault().post(new EventBusBean(2,23,"登录"));
        }
        return expire;
    }

}
